package struct.stack;

/**
 * @author: kanggw
 * @date: 2022/5/12
 * @DESCRIPTION:
 * 设计一个支持 push ，pop ，top 操作，并能在常数时间内检索到最小元素的栈。
 *
 * 实现 MinStack 类:
 *
 * MinStack() 初始化堆栈对象。
 * void push(int val) 将元素val推入堆栈。
 * void pop() 删除堆栈顶部的元素。
 * int top() 获取堆栈顶部的元素。
 * int getMin() 获取堆栈中的最小元素。
 *
 * 输入：
 * ["MinStack","push","push","push","getMin","pop","top","getMin"]
 * [[],[-2],[0],[-3],[],[],[],[]]
 *
 * 输出：
 * [null,null,null,null,-3,null,0,-2]
 *
 * 解释：
 * MinStack minStack = new MinStack();
 * minStack.push(-2);
 * minStack.push(0);
 * minStack.push(-3);
 * minStack.getMin();   --> 返回 -3.
 * minStack.pop();
 * minStack.top();      --> 返回 0.
 * minStack.getMin();   --> 返回 -2.
 * 作者：力扣 (LeetCode)
 * 链接：https://leetcode.cn/leetbook/read/top-interview-questions/xa7r55/
 * 来源：力扣（LeetCode）
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 */
public class MiniStack {

    //当前栈的大小
    private int count;
    //栈的容量
    private int size;
    //使用数组实现栈
    private int[] items;

    private Integer minValue;

    public MiniStack(int size) {
        this.minValue = null;
        this.count = 0;
        this.size = size;
        this.items = new int[size];
    }

    public boolean push(int item) {
        if (count == size) return false;

        items[count] = item;
        count++;

        processMinValue(item);
        return true;
    }

    private void processMinValue(int item) {
        if (null == minValue) {
            minValue = item;
        } else {
            minValue = item < minValue ? item : minValue;
        }
    }

    public Integer pop() {
        if (count < 1) {
            return null;

        }
        final int result = items[--count];
        processMinValue(items[count-1]);
        return result;
    }

    public Integer top() {

        if (count < 1) {
            return null;
        }

        return items[count -1];
    }
}
